///*
// * @(#) DMTObjectUtil.java 1.0 06/10/01
// */
//package io.renren.utils.util;
//
//import java.math.BigDecimal;
//import java.sql.PreparedStatement;
//import java.sql.ResultSet;
//import java.sql.SQLException;
//import java.sql.Statement;
//import java.sql.Types;
//import java.util.ArrayList;
//import java.util.Calendar;
//import java.util.List;
//import java.util.regex.Pattern;
//
//import org.apache.log4j.Logger;
//import org.springframework.jdbc.core.SqlTypeValue;
//
//import com.phy.framework.core.dmt.DMTObject;
//
//import io.renren.utils.util.SqlParser.SQLInfo;
//
//public class SqlQueryUtil {
//	private static Logger logger = Logger.getLogger(SqlQueryUtil.class);
//
//	/**
//	 * return a new array that does not contain a null element
//	 * @param obj the array that need to deal
//	 * @return the array that has been delete the null elements
//	 */
//	public static Object[] removeNullFromArrayObject(Object[] obj) {
//		List list = new ArrayList();
//		for (int i = 0; i < obj.length; i++) {
//			if (obj[i] != null) {
//				list.add(obj[i]);
//			}
//		}
//		return list.toArray();
//	}
//
//	/**
//	 * remove the slaveArray's null element by keyArray
//	 * @param keyArray the Array that is the primay key for null element
//	 * @param slaveArray the array that will be modified to remove the null elements
//	 * @return the slave array that has been delete the null elements
//	 */
//	public static Object[] removeNullFromSalveArrayObject(Object[] keyArray, Object[] slaveArray) {
//
//		List list = new ArrayList();
//		for (int i = 0; i < keyArray.length; i++) {
//			if (keyArray[i] != null) {
//				list.add(slaveArray[i]);
//			}
//		}
//		return list.toArray();
//	}
//
//	/**
//	 * remove the slaveArray's null element by keyArray
//	 * @param keyArray the Array that is the primary key for null element
//	 * @param slaveArray the array that will be modified to remove the null elements
//	 * @return the slave array that has been delete the null elements
//	 */
//	public static int[] removeNullFromSlaveArrayObject(Object[] keyArray, int[] slaveArray) {
//
//		List list = new ArrayList();
//		for (int i = 0; i < keyArray.length; i++) {
//			if (keyArray[i] != null) {
//				list.add(new Integer(slaveArray[i]));
//			}
//		}
//		int[] result = new int[list.size()];
//		for (int i = 0; i < result.length; i++) {
//			result[i] = ((Integer) list.get(i)).intValue();
//		}
//		return result;
//	}
//	
//	
//	
//	// query for DMTObject list with pagination
//	public List<DMTObject> queryForPageList(List<Object> queryParams, List<Object> queryParamVals, String orderBySql, int pageIndex, int pageSize, DMTObject dmt) throws SQLException, InstantiationException, IllegalAccessException, ClassNotFoundException{
//		int[] args = new int[]{0, pageIndex, pageSize};
//		String[] propertys = null;
//		if (queryParams!=null) {
//			propertys = (String[])queryParams.toArray(new String[0]);
//		}
//		String sql = dmt.getUtil().createSelectSQLWithProperty(dmt, propertys);
//		if (orderBySql!=null) {
//			sql = sql + " order by " + orderBySql;
//		}
//		String querySql = constuctSqlForPage(dmt.getConnection(), sql, queryParamVals, args);
//		List<DMTObject> list = queryForList(querySql, queryParamVals, dmt);
//		return new PageObject(list, args[0], pageIndex, pageSize);
//
//	}
//	// query for DMTObject list with pagination
//	public List<Object> queryForPageList(java.sql.Connection connection, String sql, List<Object> queryParamVals, int pageIndex, int pageSize) throws SQLException {
//			int[] args = new int[]{0, pageIndex, pageSize};
//			String querySql = constuctSqlForPage(connection, sql, queryParamVals, args);
//			List<Object> list = queryForList(connection, querySql, queryParamVals);
//			return new PageObject(list, args[0], pageIndex, pageSize);
//
//	}
//	
//	// query for DMTObject list with pagination
//	public List<DMTObject> queryForPageList(java.sql.Connection connection, String sql, List<Object> queryParamVals, int pageIndex, int pageSize, String expectedDMTObjClassName) throws SQLException, InstantiationException, IllegalAccessException, ClassNotFoundException {
//			int[] args = new int[]{0, pageIndex, pageSize};
//			String querySql = constuctSqlForPage(connection, sql, queryParamVals, args);
//			List<DMTObject> list = queryForList(connection, querySql, queryParamVals,expectedDMTObjClassName);
//			return new PageObject(list, args[0], pageIndex, pageSize);
//
//	}	
//	
//	// query for DMTObject list
//		public List<DMTObject> queryForList(List<Object> queryParams, List<Object> queryParamVals, String orderBySql, DMTObject dmt) throws SQLException, InstantiationException, IllegalAccessException, ClassNotFoundException{
//
//			String[] propertys = null;
//			if (queryParams!=null) {
//				propertys = (String[])queryParams.toArray(new String[0]);
//			}
//			String querySql = dmt.getUtil().createSelectSQLWithProperty(dmt, propertys);
//			if (orderBySql!=null) {
//				querySql = querySql + " order by " + orderBySql;
//			}
//			List<DMTObject> list = queryForList(querySql, queryParamVals, dmt);
//			return list;
//
//		}
//	
//	// query for DMTObject list
//	public List<DMTObject> queryForList (java.sql.Connection connection, String sql, List<Object> queryParamVals, String dmtClassName) throws SQLException, InstantiationException, IllegalAccessException, ClassNotFoundException {
//		List<DMTObject> list = new ArrayList<DMTObject>();
//		DMTObject newdmt = null;
//		if (logger.isDebugEnabled()) {
//			logger.debug("expectedObjClass "+dmtClassName);
//		}
//		ResultSet rs = null;
//		PreparedStatement pre_stmt = null;
//		try {
//			if (logger.isDebugEnabled()) {
//				logger.debug("queryForList sql: "+sql);
//			}
//			pre_stmt = connection.prepareStatement(sql);
//			if (queryParamVals!=null) { 
//				for (int j = 0; j < queryParamVals.size(); j++) {
//					setPSParameterValue(pre_stmt, j+1, queryParamVals.get(j));
//				}
//			}
//			rs = pre_stmt.executeQuery();
//			while (rs.next()) {
//				newdmt = (DMTObject)Class.forName(dmtClassName).newInstance();
//				newdmt.getUtil().fresh(newdmt, rs, true);
//				list.add(newdmt);
//			}
//
//		} finally {
//			closePreparedStatement(pre_stmt);
//			closeResultSets(rs);
//		}
//		return list;
//	}
//	
//	// query for Object list
//	public List<Object> queryForList (java.sql.Connection connection, String sql, List<Object> queryParamVals) throws SQLException {
//		List<Object> list = new ArrayList<Object>();
//		List<Object> row = null;
//		int columnCount = 0;
//		ResultSet rs = null;
//		PreparedStatement pre_stmt = null;
//		try {
//			if (logger.isDebugEnabled()) {
//				logger.debug("queryForList sql: "+sql);
//			}
//			pre_stmt = connection.prepareStatement(sql);
//			if (queryParamVals!=null) { 
//				for (int j = 0; j < queryParamVals.size(); j++) {
//					setPSParameterValue(pre_stmt, j+1, queryParamVals.get(j));
//				}
//			}
//			rs = pre_stmt.executeQuery();
//			columnCount = rs.getMetaData().getColumnCount();
//			while (rs.next()) {
//				row = new ArrayList<Object>();
//				for (int i = 1; i <= columnCount; i++) {
//					row.add(rs.getObject(i));
//				}
//				list.add(row);
//			}
//		} finally {
//			closePreparedStatement(pre_stmt);
//			closeResultSets(rs);
//		}
//		return list;
//	}
//	
//	// query for DMTObject list
//	public List<DMTObject> queryForList (String sql, List<Object> queryParamVals, DMTObject dmt)  throws SQLException, InstantiationException, IllegalAccessException, ClassNotFoundException {
//		
//		List<DMTObject> list = new ArrayList<DMTObject>();
//		DMTObject newdmt = null;
//		String dmtClassName = dmt.getClass().getName();
//		ResultSet rs = null;
//		PreparedStatement pre_stmt = null;
//		try {
//			if (logger.isDebugEnabled()) {
//				logger.debug("queryForList sql: "+sql);
//			}
//			pre_stmt = dmt.getConnection().prepareStatement(sql);
//			if(null != queryParamVals){
//				for (int j = 0; j < queryParamVals.size(); j++) {
//					setPSParameterValue(pre_stmt, j+1, queryParamVals.get(j));
//				}
//			}
//			rs = pre_stmt.executeQuery();
//		
//			while (rs.next()) {
//				newdmt = (DMTObject)Class.forName(dmtClassName).newInstance();
//				newdmt.getUtil().fresh(newdmt, rs);
//				list.add(newdmt);
//			}
//		} finally {
//			closePreparedStatement(pre_stmt);
//			closeResultSets(rs);
//		}
//		return list;
//}
//	
//	
//	private String constuctSqlForPage (java.sql.Connection connection, String sql, List<Object> queryParamVals, int[] args) throws SQLException {
//		logger.debug("the original sql [" + sql + "]");
//		int calucatedTotalRow = args[0]; 
//		int pageIndex = args[1];
//		int pageSize = args[2];
//		
//		
//		SQLInfo sqlInfo = SqlParser.parserQuerySQL(sql);
//		StringBuffer countSql = new StringBuffer("select count(1) from ");
//		String queryFields = sqlInfo.getQueryFields().trim();
//		boolean distinctSQLFlag = queryFields.toLowerCase().indexOf("distinct")>-1?true:false;
//		String subQueryAlais = "";
//		String queryFromStr = sqlInfo.getQueryFrom();
//		
//		if (distinctSQLFlag) {
//			  Pattern pattern = Pattern.compile("[, ]+"); 
//			  String[] strs = pattern.split(queryFields); 
//			  for (int i=0;i<strs.length;i++) { 
//			    if(strs[i].indexOf(".")>-1) {
//			    	subQueryAlais = strs[i].substring(0, strs[i].indexOf("."));
//			    	break;
//			    }
//			  }
//			countSql.append(" ( ").append(" select ").append(sqlInfo.getQueryFields()).append(" from ");
//			
//		}
//		countSql.append(queryFromStr);
//		countSql.append(" where ");
//		countSql.append(sqlInfo.getQueryWhere());
//		if (queryFromStr.trim().startsWith("(")) {
//			countSql.append(")");
//		}
//		if (distinctSQLFlag) {
//			countSql.append(" ").append(subQueryAlais).append(") ");
//		}
//		
//		logger.debug("the count sql [" + countSql + "]");
//		calucatedTotalRow = queryForInt(connection, countSql.toString(), queryParamVals);
//		args[0] = calucatedTotalRow;
//		if (pageIndex <= 0) {
//			pageIndex = 1;
//		}
//		StringBuffer querySql = new StringBuffer("select * from (select row_.*, rownum rownum_ from (");
//		querySql.append(sql);
//		// if pagesize & pageindex > 0 then append pagination where clause 
//		if (pageSize >= 0 && pageIndex > 0) {
//			querySql.append(") row_ where rownum <= ");
//			querySql.append(pageSize * pageIndex);
//			querySql.append(") where rownum_ >= ");
//			querySql.append(pageSize * (pageIndex - 1) + 1);
//		}
//		logger.debug("the query page sql [" + querySql + "]");
//		logger.debug("total rows [" + calucatedTotalRow + "]");
//		return querySql.toString();
//	}
//	
//	private int queryForInt (java.sql.Connection connection, String sql, List<Object> queryParamVals) throws SQLException {
//		int i = 0;
//		ResultSet rs = null;
//		PreparedStatement pre_stmt = null;
//		try {
//			if (logger.isDebugEnabled()) {
//				logger.debug("queryForInt sql: "+sql);
//			}
//			pre_stmt = connection.prepareStatement(sql);
//			if (queryParamVals!=null) { 
//				for (int j = 0; j < queryParamVals.size(); j++) {
//					setPSParameterValue(pre_stmt, j+1, queryParamVals.get(j));
//				}
//			}
//			rs = pre_stmt.executeQuery(); 
//			if (rs.next()) {
//				 i = rs.getInt(1);
//			}
//		} finally {
//			closePreparedStatement(pre_stmt);
//			closeResultSets(rs);
//		}
//		return i;
//	}
//
//	/**
//	 * Set the value for a parameter. The method used is based on the SQL type
//	 * of the parameter and we can handle complex types like arrays and LOBs.
//	 * @param ps the prepared statement or callable statement
//	 * @param paramIndex index of the parameter we are setting
//	 * @param sqlType the SQL type of the parameter
//	 * @param typeName the type name of the parameter
//	 * (optional, only used for SQL NULL and SqlTypeValue)
//	 * @param inValue the value to set
//	 * @throws SQLException if thrown by PreparedStatement methods
//	 * @see SqlTypeValue
//	 */
//	public static void setPSParameterValue(PreparedStatement ps, int paramIndex, Object inValue) throws SQLException {
//		if (logger.isDebugEnabled())
//			logger.debug(">>>>>>paramIndex:" + paramIndex + " typeName:" + inValue.getClass().getName() + " inValue:" + inValue);
//		if (inValue == null) {
//			ps.setNull(paramIndex, Types.NULL);
//		} else if (inValue instanceof String) {
//			ps.setString(paramIndex, (String)inValue);
//		} else if (inValue instanceof BigDecimal) {
//			ps.setString(paramIndex, (String)inValue);
////		} else if (inValue instanceof Number) {
////			if (inValue instanceof Integer) {
////				ps.setInt(paramIndex, ((Integer)inValue));
////			} 
//		} else if (inValue instanceof java.util.Date) {
//			if (inValue instanceof java.sql.Time) {
//				ps.setTime(paramIndex, (java.sql.Time) inValue);
//			} else if (inValue instanceof java.sql.Timestamp) {
//				ps.setTimestamp(paramIndex, (java.sql.Timestamp) inValue);
//			} else if (inValue instanceof java.sql.Date) {
//				ps.setDate(paramIndex, (java.sql.Date) inValue);
//			} else {
//				ps.setDate(paramIndex, new java.sql.Date(((java.util.Date) inValue).getTime()));
//			}
//		} else if (inValue instanceof Calendar) {
//			Calendar cal = (Calendar) inValue;
//			ps.setDate(paramIndex, new java.sql.Date(cal.getTime().getTime()), cal);
//		}  else {
//			// Fall back to generic setObject call with SQL type specified.
//			ps.setObject(paramIndex, inValue);
//		}
//	}
//	
//	/**
//	 * 关闭 Statement
//	 */
//	public static void closeStatement(Statement... statements) {
//		if (statements != null && statements.length > 0) {
//			for (Statement statement : statements) {
//				if (statement != null) {
//					try {
//						statement.close();
//					} catch (SQLException e) {
//						e.printStackTrace();
//					}
//				}
//			}
//		}
//	}
//
//	/**
//	 * 关闭 PreparedStatement
//	 */
//	public static void closePreparedStatement(PreparedStatement... preparedStatement) {
//		if (preparedStatement != null && preparedStatement.length > 0) {
//			for (PreparedStatement statement : preparedStatement) {
//				if (statement != null) {
//					try {
//						statement.close();
//					} catch (SQLException e) {
//						e.printStackTrace();
//					}
//				}
//			}
//		}
//	}
//
//	/**
//	 * 关闭 ResultSets
//	 */
//	public static void closeResultSets(ResultSet... resultSets) {
//		if (resultSets != null && resultSets.length > 0) {
//			for (ResultSet resultSet : resultSets) {
//				if (resultSet != null) {
//					try {
//						resultSet.close();
//					} catch (SQLException e) {
//						e.printStackTrace();
//					}
//				}
//			}
//		}
//	}
//}